/*-------------------------------------------------------------------------
  Author (C) 2008, Charles Wang <charlesw123456@gmail.com>

  This program is free software; you can redistribute it and/or modify it 
  under the terms of the GNU General Public License as published by the 
  Free Software Foundation; either version 2, or (at your option) any 
  later version.

  This program is distributed in the hope that it will be useful, but 
  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  for more details.

  You should have received a copy of the GNU General Public License along 
  with this program; if not, write to the Free Software Foundation, Inc., 
  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

  As an exception, it is allowed to write an extension of Coco/R that is
  used as a plugin in non-free software.

  If not otherwise stated, any source code generated by Coco/R (other than 
  Coco/R itself) does not fall under the GNU General Public License.
-------------------------------------------------------------------------*/
#ifndef  COCO_BUFFER_H
#define  COCO_BUFFER_H

#ifndef  COCO_CDEFS_H
#include  "CDefs.h"
#endif

EXTC_BEGIN

typedef struct CcsBuffer_s CcsBuffer_t;
struct CcsBuffer_s {
    FILE * fp;
    long   start;
    char * buf;
    char * busyFirst; /* The first char used by Token_t. */
    char * lockCur;   /* The value of of cur when locked. */
    char * lockNext;  /* The value of next when locked. */
    char * cur;    /* The first char of the current char in Scanner_t.*/
    char * next;   /* The first char of the next char in Scanner_t. */
    char * loaded;
    char * last;
};

/* CcsBuffer_t members for Scanner_t. */
/* fp should be opened with 'r' mode to deal with CR/LF. */
CcsBuffer_t * CcsBuffer(CcsBuffer_t * self, FILE * fp);
void CcsBuffer_Destruct(CcsBuffer_t * self);
long CcsBuffer_GetPos(CcsBuffer_t * self);
int CcsBuffer_Read(CcsBuffer_t * self, int * retBytes);
const char * CcsBuffer_GetString(CcsBuffer_t * self, long start, size_t size);
void CcsBuffer_SetBusy(CcsBuffer_t * self, long startBusy);
void CcsBuffer_ClearBusy(CcsBuffer_t * self);
void CcsBuffer_Lock(CcsBuffer_t * self);
void CcsBuffer_LockReset(CcsBuffer_t * self);
void CcsBuffer_Unlock(CcsBuffer_t * self);

EXTC_END

#endif /* COCO_BUFFER_H */
